08|接口与抽象类

接口和抽象类是很多设计模式、设计思想、设计原则编程实现的基础。

抽象类

  • 不允许被实例化
  • 抽象类包含属性和方法。其中方法可以包含代码实现,也可以不包含代码实现(抽象方法)
  • 子类集成抽象类。子类必须实现抽象类的抽象方法。

接口类

  • 接口不能包含属性(成员变量)
  • 接口只能声明方法,方法不能包含方法实现
  • 类实现接口的时候,必须实现接口的所有方法。

抽象类与接口类的区别

  • 抽象类的本质是类,主要只能被子类去继承,体现着is-a的继承关系
  • 接口类表示一种has-a的关系,体现具有某些功能,表现为一种约定和协议。

抽象类和接口类能解决什么问题

抽象类

  • 代码复用,避免在子类中编写相同的代码

同样是代码复用,为什么不直接用继承,而要使用抽象类来实现?相比继承来说,抽象类的实现更加的优雅

  • 父类中定义一个被子类继承的无意义的log()方法会使代码的可读性变差。
  • 创建子类的时候,会忘记重写log()。然而抽象类会强制子类实现。
  • 继承中,父类是可以被实例化的,我们可以调用空的log()方法,会增加类误用的风险。(可以通过设置私有构造函数解决)

接口类

侧重于解耦。对行为进行抽象,之关系接口的协议,不关心具体实现,实现约定与实现相分离。

模拟接口类和抽象类

模拟接口类

普通类模拟接口类

  • protect访问权限,避免类被实例化
  • 不含具体实现的方法
1
2
3
4
5
6
public class MockInteface { 
protected MockInteface() {}
public void funcA() {
throw new MethodUnSupportedException();
}
}

抽象类和接口类的使用

  • 抽象类:is-a的关系,解决代码复用的问题
  • 接口类:has-a的关系,解决耦合的问题,表示一组行为特征,隔离接口和具体实现